package othello.client.utility.screen;

import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * スクリーンを表すクラス。
 * </p>
 * <p>
 * インスタンスに登録されたScreenItemが該当するCanvas要素に描画される。
 * インスタンスは次のタイミングのあとのexecuteのタイミングで描画される。
 * <ul>
 * <li>ScreenItemの追加、削除があった場合</li>
 * <li>ScreenItemのnotifyUpdateを受け取った</li>
 * </ul>
 * </p>
 */
public class ScreenManager implements View.Observer {

	/**
	 * 描画対象とするスクリーン
	 */
	private final Screen screen;

	/**
	 * スクリーン上に描画対象のActor
	 */
	private final List<View> actors = new ArrayList<View>();

	/**
	 * 更新通知のキャッシュ
	 */
	private boolean needToRedraw = true;

	/**
	 * コンストラクター。
	 * 
	 * @param canvas
	 *            描画対象のキャンバス要素
	 */
	public ScreenManager(Screen screen) {
		this.screen = screen;
	}

	/**
	 * 画面に表示するアイテムを登録する。
	 * 
	 * @param actor
	 *            画面表示アイテム
	 */
	public void entry(View actor) {
		this.actors.add(actor);
		this.notifyUpdate();
		actor.addObserver(this);
	}

	/**
	 * 更新を通知する。
	 */
	@Override
	public void notifyUpdate() {
		this.needToRedraw = true;
	}

	/**
	 * 更新が通知されていれば画面の更新を行う
	 */
	public boolean updateScreen() {
		if (this.needToRedraw) {
			this.screen.clear();
			for (View i : this.actors) {
				i.draw(this.screen);
			}
			this.needToRedraw = false;
		}
		return true;
	}

}